#include <iostream>
#include <unistd.h>
#include <functional>
#include <vector>
#include <signal.h>
#include <sys/types.h>

void PrintPending(sigset_t &pending)
{
    printf("我是一个进程（%d）,pending :",getpid());
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

void handler(int sig)
{
    std::cout<<"###################"<<std::endl;
    std::cout<<"递达"<<sig<<"信号！"<<std::endl;
    sigset_t pending;
    int m=sigpending(&pending);
    PrintPending(pending);
    std::cout<<"####################"<<std::endl;
}

int main()
{
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    sigaddset(&block, SIGINT);
    int n = sigprocmask(SIG_SETMASK, &block, &oblock);
    (void)n;

    // 4.重复获取打印过程
    int cnt=0;
    while (true)
    {
        // 2.获取pending信号集合
        sigset_t pending;
        int m = sigpending(&pending);

        //3.打印
        PrintPending(pending);
        if(cnt==10)
        {
            //5.恢复对2号信号的block情况
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
            std::cout<<"对解除2号的屏蔽"<<std::endl;
        }
        
        sleep(1);
        cnt++;
    }
}

/*void handlerSig(int sig)
{

   std::cout<<"hello world"<<sig<<std::endl;
   signal(2,SIG_DFL);
   std::cout<<"恢复处理动作"<<std::endl;
    //exit(12);
}

int main()
{
    //signal(2,handler);
    signal(2,SIG_IGN);

    while (true)
    {
        sleep(1);
        std::cout<<"."<<std::endl;
    }

    return 0;
}
struct task_struct
{
    pid_t id;
    int count=10;//时间片  相当于一个计数器
    void(*code)();
};

///////////////func////////////
void Sched()
{
    std::cout<<"我是进程调度"<<std::endl;
    t.count--;
    if(t.count<=0)
        //切换其他进程
}
void MemManger()
{
    std::cout<<"我是周期性的内存管理，正在检查有没有内存问题"<<std::endl;
}
void Fflush()
{
    std::cout<<"我是刷新程序，我在定期刷新内存数据，到磁盘"<<std::endl;
}
///////////////
using func_t=std::function<void()>;

std::vector<func_t> funcs;
int timestamp=0;

void handlerSig(int sig)
{
    timestamp++;
    std::cout<<"####################"<<std::endl;
    for(auto f: funcs)
        f();
    std::cout<<"####################"<<std::endl;
    int n=alarm(1);
    //exit(12);
}

int main()
{
    funcs.push_back(Sched);
    funcs.push_back(MemManger);
    funcs.push_back(Fflush);

    signal(SIGALRM,handlerSig);
    alarm(1);

    while(true)
    {
        //本质是IO xshell-》./XXX->云服务器->网络->我们看到的
        //std::cout<<"hello world"<< cnt++ <<"，pid:"<<getpid()<<std::endl;
        pause();
    }
    return 0;
}*/